package com.tju.ocean_ecology_website.service.impl;

import com.tju.ocean_ecology_website.security.JwtTokenUtil;
import com.tju.ocean_ecology_website.service.TokenBlacklistService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 基于内存的令牌黑名单服务实现
 * 注意：在生产环境中，应该使用Redis等分布式缓存来存储黑名单
 */
@Service
public class InMemoryTokenBlacklistService implements TokenBlacklistService {
    
    // 使用ConcurrentHashMap存储黑名单令牌及其过期时间
    private final Map<String, Date> blacklist = new ConcurrentHashMap<>();
    
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    
    @Override
    public void addToBlacklist(String token) {
        try {
            // 获取令牌的过期时间
            Date expirationDate = jwtTokenUtil.getExpirationDateFromToken(token);
            // 将令牌添加到黑名单
            blacklist.put(token, expirationDate);
        } catch (Exception e) {
            // 如果令牌已经无效，则不需要添加到黑名单
        }
    }
    
    @Override
    public boolean isBlacklisted(String token) {
        return blacklist.containsKey(token);
    }
    
    /**
     * 定时清理过期的令牌，每小时执行一次
     */
    @Override
    @Scheduled(fixedRate = 3600000) // 每小时执行一次
    public void cleanupExpiredTokens() {
        Date now = new Date();
        blacklist.entrySet().removeIf(entry -> entry.getValue().before(now));
    }
}
